/*
//默认初始化
// 对于成员变量来说，如果没有进⾏初始化，会有⼀个对应的默认值
public class Date2 {
    public int year;
    public int month;
    public int day;
    public static void main(String[] args) {
        // 此处a没有初始化，编译时报错：
        // Error:(24, 28) java: 可能尚未初始化变量a
        // int a;
        // System.out.println(a);
        Date2 d = new Date2();
        System.out.println(d.year);
        System.out.println(d.month);
        System.out.println(d.day);
    }
}




//就地初始化
//在声明成员变量时，就直接给出了初始值。
public class Date2 {
    public int year = 1900;
    public int month = 1;
    public int day = 1;
    public Date2(){
    }
    public Date2(int year, int month, int day) {
    }
    public static void main(String[] args) {
        Date2 d1 = new Date2(2021,6,9);
        Date2 d2 = new Date2();
    }
}




//构造方法（没有返回值也不可以加void、类名与方法名相同）
//在创建对象时，由编译器⾃动调⽤，并且在整个对象的⽣命周期内只调⽤⼀次。
//构造方法可以重载（方法名相同，参数列表不同）

public class Date2 {
    public int year;
    public int month;
    public int day;

    public Date2(int year, int month, int day){
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("Date2(int,int,int)⽅法被调⽤了");
    }

    public void printDate(){
        System.out.println(year + "-" + month + "-" + day);
    }
    public static void main(String[] args) {
        // 此处创建了⼀个Date2类型的对象，并没有显式调⽤构造⽅法
        Date2 d = new Date2(1999,6,9); // 输出Date2(int,int,int)⽅法被调⽤了
        d.printDate(); // 1999-6-9
    }
}





public class Date {
    public int year;
    public int month;
    public int day;

    // ⽆参构造⽅法
    public Date() {
        this.year = 1900;
        this.month = 1;
        this.day = 1;
    }

    // 带有三个参数的构造⽅法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public void printDate() {
        System.out.println(year + "-" + month + "-" + day);
    }

    public static void main(String[] args) {
        Date d = new Date();
        d.printDate();
    }
}
//上述两个构造⽅法：名字相同，参数列表不同，因此构成了⽅法重载。




//如果⽤⼾没有显式定义，编译器会⽣成⼀份默认的构造⽅法，⽣成的默认构造⽅法⼀定是⽆参的。
public class Date {
    public int year;
    public int month;
    public int day;
    public void printDate(){
        System.out.println(year + "-" + month + "-" + day);
    }
    public static void main(String[] args) {
        Date d = new Date();
        d.printDate();
    }
}
//上述Date类中，没有定义任何构造⽅法，编译器会默认⽣成⼀个不带参数的构造⽅法





//⼀旦⽤⼾定义了其他的构造⽅法，编译器则不再⽣成。
public class Date {
    public int year;
    public int month;
    public int day;
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
    public void printDate(){
        System.out.println(year + "-" + month + "-" + day);
    }
    public static void main(String[] args) {
        Date d = new Date();
        d.printDate();
    }
}
//上述代码运⾏之后会显⽰，没有⽆参构造⽅法。




//构造⽅法中，可以通过this调⽤其他构造⽅法来简化代码
public class Date2 {
    public int year;
    public int month;
    public int day;

    public Date2(){
        this(1900, 1, 1);
    }
    // 带有三个参数的构造⽅法
    public Date2(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
}
//this(...)必须是构造⽅法中第⼀条语句
//不能形成环的调⽤
public Date2(){
    this(1900,1,1);
}
public Date2(int year, int month, int day) {
    this();
}
//绝⼤多数情况下使⽤public来修饰，特殊场景下会被private修饰*/
